iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

今天的標題是"取得及更新Entity Card Values",而不是"更新Entity"。

原因是Entity在建立之後,我們不太會去對Entity本身做改變,一般想改動的是其card values,也就是fields的部份。

要取得及更新Entity Card Values,需要使用gettersetter function(雖然這看起來不太pythonic, we know...)。

要改變card values有兩種方法:

  • base.GetEntityCardValuesSetEntityCardValues
  • Entity本身的get_entity_valuesset_entity_values

我們比較習慣後者,所以以此為我們的coding style。

舉例來說,下面我們先建立一個座標為(1,2,3)node Entity,接著利用Entity.set_entity_valuesX座標改為10

def get_set_node_card_values():
    deck = constants.LSDYNA
    type_ = 'NODE'
    fields = {'X': 1, 'Y': 2, 'Z': 3}
    node = base.CreateEntity(deck, type_, fields)
    set_ret = node.set_entity_values(deck, {'X': 10})
    print(f'{set_ret=}')

    card_values = node.get_entity_values(deck, tuple(fields.keys()))
    print(f'{card_values=}')

如果set成功的話會回傳0,否則則回傳非零值
如果get成功的話會回傳一個dictkey為所要求的fieldvalue為其card value
否則會回傳一個空的dict

觀察card_values可知,我們已經成功將X座標改為10

set_ret=0
card_values={'X': 10.0, 'Y': 2.0, 'Z': 3.0}

舉個getset失敗的例子來說。

def get_set_node_card_values_failed():
    deck = constants.LSDYNA
    type_ = 'NODE'
    fields = {'X': 1, 'Y': 2, 'Z': 3}
    node = base.CreateEntity(deck, type_, fields)
    set_ret = node.set_entity_values(deck, {'A': 10})
    print(f'{set_ret=}')

    card_values = node.get_entity_values(deck, ['A'])
    print(f'{card_values=}')

由於A並不存在nodefields內,所以set會失敗,回傳值為1
同理get也會失敗,回傳值為空的dict

set_ret=1
card_values={}

對於一些少遇見的Entity,我們並不熟悉其有哪些fields可以控制,此時可以先利用Entitycard_fields取得fields,再搭配get_entity_values來觀察其card values

def get_all_node_card_values():
    deck = constants.LSDYNA
    type_ = 'NODE'
    fields = {'X': 1, 'Y': 2, 'Z': 3}
    node = base.CreateEntity(deck, type_, fields)
    fields = node.card_fields(deck)
    card_values = node.get_entity_values(deck, fields)
    print(f'{card_values=}')

其輸出為:

card_values={'TYPE': '*NODE', 'NID': 1, 'X': 10.0, 'Y': 2.0, 'Z': 3.0, 'TC': '0: none', 'RC': '0: none', 'Name': '', 'FROZEN_ID': 'NO', 'FROZEN_DELETE': 'NO', 'DEFINED': 'YES', 'AUXILIARY': 'NO', 'Comment': '', 'MBContainer': None, 'MBContainers': []}

另外,每個Entity有一些常用的attribute,不需使用getter,就可以直接存取,像是Entity._nameEntity_idEntity._comment

比較特別的是point-like Entity,可以利用Entity.position來直接getset其座標。所以這個例題比較有效率的寫法會是下面這樣。

def get_set_node_card_values_fast():
    deck = constants.LSDYNA
    type_ = 'NODE'
    fields = {'X': 1, 'Y': 2, 'Z': 3}
    node = base.CreateEntity(deck, type_, fields)
    node.position = (10, 2, 3)
    print(f'{node.position=}')

其輸出為:

node.position=(10.0, 2.0, 3.0)

小結

關於ANSA的CRUD操作,於今天告一段落。[Day06]開始,我們將利用這些操作,建立一個box drop project。

除了需要使用gettersetter有些不Pythonic外,我們覺得ANSA API使用上比較麻煩的地方是,每一種CRUD操作,對於成功或失敗,會回傳不同的值。所以有時在debug時,需要來回穿梭於回傳值及手冊間,難道這是BETA CAE Systems想讓我們多熟悉手冊而特意安排的(苦笑)?

Code

本日程式碼傳送門


上一篇
[Day04] - 取得Entity及Entities
下一篇
[Day06] - 建立Box Drop Project(1)
系列文
或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言